home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 25
/
Aminet 25 (1998)(GTI - Schatztruhe)[!][Jun 1998].iso
/
Aminet
/
game
/
shoot
/
ADoom_src_1_2.lha
/
ADoom_src
/
amiga_things.s
< prev
next >
Wrap
Text File
|
1998-03-01
|
19KB
|
882 lines
mc68020
xdef @R_AddSprites
xdef _R_AddSprites
xdef @R_DrawMasked
xdef _R_DrawMasked
xdef @R_DrawSprite
xdef _R_DrawSprite
xdef @R_DrawVisSprite
xdef _R_DrawVisSprite
xdef @R_SortVisSprites
xdef _R_SortVisSprites
xdef @R_NewVisSprite
xdef _R_NewVisSprite
xdef @R_ClearSprites
xdef _R_ClearSprites
section text,code
near a4,-2
;-----------------------------------------------------------------------
include "exec/types.i"
;-----------------------------------------------------------------------
; R_AddSprites (in r_things.c) by Arto Huusko <arto.huusko@pp.qnet.fi>
xref _extralight
xref _scalelight
xref _spritelights
xref @R_ProjectSprite
xref _validcount
STRUCTURE sector,0
LONG st_floorheight
LONG st_ceilingheight
WORD st_floorpic
WORD st_ceilingpic
WORD st_lightlevel
WORD st_special
WORD st_tag
LONG st_soundtraversed
APTR st_soundtarget
STRUCT st_blockbox,4*4
STRUCT st_shit,24
LONG st_validcount
APTR st_thinglist
;etc. etc.
snext EQU 24
@R_AddSprites:
_R_AddSprites:
move.l _validcount(a4),d0
cmp.l st_validcount(a0),d0
beq.b .ra_Exit
move.l d2,-(sp)
move.l d0,st_validcount(a0)
moveq #0,d0
move.w st_lightlevel(a0),d0
lsr.l #4,d0
move.l #_scalelight,_spritelights(a4)
add.l _extralight(a4),d0
bmi.b .ra_LightDone
cmp.l #16,d0
bmi.b .ra_LightOK
add.l #2880,_spritelights(a4)
bra.b .ra_LightDone
.ra_LightOK:
move.l d0,d2
lsl.l #7,d0
lsl.l #6,d2
add.l d0,d2
add.l d2,_spritelights(a4)
.ra_LightDone:
move.l st_thinglist(a0),d2
beq.b .ra_AllDone
.ra_Loop:
move.l d2,a0
move.l snext(a0),d2
beq.b .ral_Done
jsr (@R_ProjectSprite)
bra.b .ra_Loop
.ral_Done:
jsr (@R_ProjectSprite)
.ra_AllDone:
move.l (sp)+,d2
.ra_Exit:
rts
;void R_AddSprites (sector_t* sec)
;{
; mobj_t* thing;
; int lightnum;
;
; // BSP is traversed by subsector.
; // A sector might have been split into several
; // subsectors during BSP building.
; // Thus we check whether its already added.
; if (sec->validcount == validcount)
; return;
;
; // Well, now it will be done.
; sec->validcount = validcount;
;
; lightnum = (sec->lightlevel >> LIGHTSEGSHIFT)+extralight;
;
; if (lightnum < 0)
; spritelights = scalelight[0];
; else if (lightnum >= LIGHTLEVELS)
; spritelights = scalelight[LIGHTLEVELS-1];
; else
; spritelights = scalelight[lightnum];
;
; // Handle all things in sector.
; for (thing = sec->thinglist ; thing ; thing = thing->snext)
; R_ProjectSprite (thing);
;}
;-----------------------------------------------------------------------
; R_DrawMasked (in r_things.c) by Arto Huusko <arto.huusko@pp.qnet.fi>
;;; xref @R_SortVisSprites
xref _vissprite_p ;vissprite_t*
xref _vissprites ;FAR vissprite_t[MAXVISSPRITES]
xref _ds_p ;drawseg_t*
xref _drawsegs ;FAR drawseg_t drawsegs[MAXDRAWSEGS]
xref @R_RenderMaskedSegRange
xref _viewangleoffset ;int
xref _vsprsortedhead ;vissprite_t
xref @R_DrawPlayerSprites
xref @R_PointOnSegSide
xref @R_RenderMaskedSegRange
;;; xref @R_DrawVisSprite
xref _mfloorclip
xref _mceilingclip
xref _viewheight
;;; xref @R_DrawSprite
STRUCTURE vissprite,0
APTR vp_prev
APTR vp_next
LONG vp_x1
LONG vp_x2
LONG vp_gx
LONG vp_gy
LONG vp_gz
LONG vp_gzt
LONG vp_startfrac
LONG vp_scale
LONG vp_xiscale
LONG vp_texturemid
LONG vp_patch
APTR vp_colormap
LONG vp_mobjflags
LABEL vp_size
STRUCTURE drawseg,0
APTR ds_curline
LONG ds_x1
LONG ds_x2
LONG ds_scale1
LONG ds_scale2
LONG ds_scalestep
LONG ds_silhouette
LONG ds_bsilheight
LONG ds_tsilheight
APTR ds_sprtopclip
APTR ds_sprbottomclip
APTR ds_maskedtexturecol
LABEL ds_size
cnop 0,4
@R_DrawMasked:
_R_DrawMasked:
movem.l a2/a3,-(sp)
jsr (@R_SortVisSprites)
move.l #_vissprites,d1
move.l _vissprite_p(a4),d0
cmp.l d0,d1
bge.b .rdm_Skip1
lea _vsprsortedhead(a4),a3
move.l 4(a3),a2
.rdm_Loop1:
move.l a2,a0
jsr (@R_DrawSprite)
move.l vp_next(a2),a2
cmp.l a2,a3
bne.b .rdm_Loop1
.rdm_Skip1:
move.l #_drawsegs,a3
move.l _ds_p(a4),a2
sub.l #ds_size,a2
.rdm_Loop2:
tst.l ds_maskedtexturecol(a2)
beq.b .rdml2_Skip
move.l a2,a0
move.l ds_x1(a2),d0
move.l ds_x2(a2),d1
jsr (@R_RenderMaskedSegRange)
.rdml2_Skip:
sub.l #ds_size,a2
cmp.l a3,a2
bge.b .rdm_Loop2
tst.l _viewangleoffset(a4)
bne.b .rdm_Exit
jsr (@R_DrawPlayerSprites)
.rdm_Exit:
movem.l (sp)+,a2/a3
rts
;void R_DrawMasked (void)
;{
; vissprite_t* spr;
; drawseg_t* ds;
;
; R_SortVisSprites ();
;
; if (vissprite_p > vissprites)
; {
; // draw all vissprites back to front
; for (spr = vsprsortedhead.next ;
; spr != &vsprsortedhead ;
; spr=spr->next)
; {
;
; R_DrawSprite (spr);
; }
; }
;
; // render any remaining masked mid textures
; for (ds=ds_p-1 ; ds >= drawsegs ; ds--)
; if (ds->maskedtexturecol)
; R_RenderMaskedSegRange (ds, ds->x1, ds->x2);
;
; // draw the psprites on top of everything
; // but does not draw on side views
; if (!viewangleoffset)
; R_DrawPlayerSprites ();
;}
;-----------------------------------------------------------------------
; R_DrawSprite (in r_things.c) by Arto Huusko <arto.huusko@pp.qnet.fi>
;;; xref @R_SortVisSprites
xref _vissprite_p ;vissprite_t*
xref _vissprites ;FAR vissprite_t[MAXVISSPRITES]
xref _ds_p ;drawseg_t*
xref _drawsegs ;FAR drawseg_t drawsegs[MAXDRAWSEGS]
xref @R_RenderMaskedSegRange
xref _viewangleoffset ;int
xref _vsprsortedhead ;vissprite_t
xref @R_DrawPlayerSprites
xref @R_PointOnSegSide
xref @R_RenderMaskedSegRange
;;; xref @R_DrawVisSprite
xref _mfloorclip
xref _mceilingclip
xref _viewheight
xref @memcpy
@R_DrawSprite:
_R_DrawSprite:
movem.l d2-d7/a2/a3/a5/a6,-(sp)
move.l a0,a3 ;save the sprite
move.l vp_x2(a0),d0
move.l vp_x1(a0),d1
sub.l d1,d0
blt.b .rds_Skip1
add.l d1,d1
;;; move.l #clipbot,a0
lea clipbot(a4),a0
add.l d1,a0
;;; move.l #cliptop,a1
lea cliptop(a4),a1
add.l d1,a1
btst.l #1,d1
beq.b .rds_BoundOK
move.w #-2,(a0)+
move.w #-2,(a1)+
subq.l #1,d0
bmi.b .rds_Skip1
beq.b .rdsl1_Last
.rds_BoundOK:
move.b d0,d1
.rds_Loop1:
move.l #$FFFEFFFE,(a0)+
move.l #$FFFEFFFE,(a1)+
subq.l #2,d0
bgt.b .rds_Loop1
btst.l #0,d1
bne.b .rds_Skip1
.rdsl1_Last:
move.w #-2,(a0)
move.w #-2,(a1)
.rds_Skip1:
move.l _ds_p(a4),a2
sub.l #ds_size,a2 ;ds (a2) = ds_p-1
move.l #_drawsegs,d7
move.l vp_scale(a3),d2 ;these ones are used in loop below and
move.l vp_gz(a3),d3
move.l vp_gzt(a3),d4
.rds_Loop2:
move.l ds_x1(a2),d0
move.l ds_x2(a2),d1
move.l vp_x1(a3),d5
move.l vp_x2(a3),d6
cmp.l d6,d0
bgt.b .rdsl2_Next
cmp.l d5,d1
blt.b .rdsl2_Next
tst.l ds_silhouette(a2)
bne.b .rdsl2_DoLoop
tst.l ds_maskedtexturecol(a2)
beq.b .rdsl2_Next
.rdsl2_DoLoop:
cmp.l d5,d0
blt.b .rdsl2_R1OK
move.l d0,d5
.rdsl2_R1OK:
cmp.l d6,d1
bgt.b .rdsl2_R2OK
move.l d1,d6
.rdsl2_R2OK:
;At this stage:
;a2: ds (always, really)
;a3: spr (always, too)
;d5: r1
;d6: r2
move.l ds_scale1(a2),d0 ;scale (?)
move.l ds_scale2(a2),d1 ;lowscale (?)
cmp.l d0,d1
blt.b .rdsl2_ScalesOK
move.l d1,d0
move.l ds_scale1(a2),d1
.rdsl2_ScalesOK:
;now:
;d1:lowscale
;d0:scale
cmp.l d2,d0
blt.b .rdsl2_DoStuff1 ;scale<spr->scale is TRUE, RenderMaskedSegRange
cmp.l d2,d1
bge.b .rdsl2_SkipStuff1 ;above is FALSE, lowscale<spr->scale is false... no RMSR
move.l vp_gx(a3),d0
move.l vp_gy(a3),d1
move.l ds_curline(a2),a0
jsr (@R_PointOnSegSide)
tst.l d0
bne.b .rdsl2_SkipStuff1 ;all above is FALSE and PointOnSegSide is TRUE.. so the expression is false => skip
.rdsl2_DoStuff1:
tst.l ds_maskedtexturecol(a2)
beq.b .rdsl2_Next
move.l a2,a0 ;(ds,
move.l d5,d0 ;r1,
move.l d6,d1 ;r2)
jsr (@R_RenderMaskedSegRange)
bra.b .rdsl2_Next
.rdsl2_SkipStuff1:
move.l ds_silhouette(a2),d0
beq.b .rdsl2_Next ;silhouette is zero, no point ANDing and testing..
cmp.l ds_bsilheight(a2),d3
blt.b .rdsl2_SilSkip1
and.l #~1,d0 ;silhouette &=~SIL_BOTTOM
beq.b .rdsl2_Next ;went zero, no tests!
.rdsl2_SilSkip1:
cmp.l ds_tsilheight(a2),d4
bgt.b .rdsl2_SilSkip2
and.l #~2,d0 ;silhouette &=~SIL_TOP
beq.b .rdsl2_Next ;went zero
.rdsl2_SilSkip2:
cmp.l #1,d0
bne.b .rdsl2_SilNot1
sub.l d5,d6 ;x=r1 x<=r2
blt.b .rdsl2_Next
add.l d5,d5
;;; move.l #clipbot,a0
lea clipbot(a4),a0
add.l d5,a0
move.l ds_sprbottomclip(a2),a1
add.l d5,a1
.rdsl2_SilLoop1:
move.w (a1)+,d0
cmp.w #-2,(a0)+
bne.b .rdsl2sl1_Skip
move.w d0,-2(a0)
.rdsl2sl1_Skip:
dbf d6,.rdsl2_SilLoop1
bra.b .rdsl2_Next
.rdsl2_SilNot1:
cmp.l #2,d0
bne.b .rdsl2_SilNot2
sub.l d5,d6
blt.b .rdsl2_Next
add.l d5,d5
;;; move.l #cliptop,a0
lea cliptop(a4),a0
add.l d5,a0
move.l ds_sprtopclip(a2),a1
add.l d5,a1
.rdsl2_SilLoop2:
move.w (a1)+,d0
cmp.w #-2,(a0)+
bne.b .rdsl2sl2_Skip
move.w d0,-2(a0)
.rdsl2sl2_Skip:
dbf d6,.rdsl2_SilLoop2
bra.b .rdsl2_Next
.rdsl2_SilNot2:
cmp.l #3,d0
bne.b .rdsl2_Next
sub.l d5,d6
blt.b .rdsl2_Next
lsl.l #1,d5
;;; move.l #cliptop,a0
lea cliptop(a4),a0
add.l d5,a0
;;; move.l #clipbot,a1
lea clipbot(a4),a1
add.l d5,a1
move.l ds_sprbottomclip(a2),a5
move.l ds_sprtopclip(a2),a6
add.l d5,a5
add.l d5,a6
.rdsl2_SilLoop3:
move.w (a5)+,d0
move.w (a6)+,d1
cmp.w #-2,(a0)+
bne.b .rdsl2sl3_Skip1
move.w d1,-2(a0)
.rdsl2sl3_Skip1:
cmp.w #-2,(a1)+
bne.b .rdsl2sl3_Skip2
move.w d0,-2(a1)
.rdsl2sl3_Skip2:
dbf d6,.rdsl2_SilLoop3
.rdsl2_Next:
sub.l #ds_size,a2
cmp.l d7,a2
bge.b .rds_Loop2
move.l vp_x2(a3),d0 ;spr->x2
sub.l vp_x1(a3),d0 ;x<=spr->x2
blt.b .rds_SkipL3
move.l vp_x1(a3),d7 ;x
add.l d7,d7
move.l _viewheight(a4),d1
;;; move.l #clipbot,a0
lea clipbot(a4),a0
add.l d7,a0
;;; move.l #cliptop,a1
lea cliptop(a4),a1
add.l d7,a1
.rds_Loop3:
cmp.w #-2,(a0)+
bne.b .rdsl3_Skip1
move.w d1,-2(a0)
.rdsl3_Skip1:
cmp.w #-2,(a1)+
bne.b .rdsl3_Skip2
move.w #-1,-2(a1)
.rdsl3_Skip2:
dbf d0,.rds_Loop3
.rds_SkipL3:
;;; move.l #clipbot,_mfloorclip(a4)
lea clipbot(a4),a0
move.l a0,_mfloorclip(a4)
;;; move.l #cliptop,_mceilingclip(a4)
lea cliptop(a4),a0
move.l a0,_mceilingclip(a4)
move.l a3,a0
movem.l (sp)+,d2-d7/a2/a3/a5/a6
jmp (@R_DrawVisSprite)
;void R_DrawSprite (vissprite_t* spr)
;{
; drawseg_t* ds;
; static short clipbot[MAXSCREENWIDTH];
; static short cliptop[MAXSCREENWIDTH];
; int x;
; int r1;
; int r2;
; fixed_t scale;
; fixed_t lowscale;
; int silhouette;
;
; for (x = spr->x1 ; x<=spr->x2 ; x++)
; clipbot[x] = cliptop[x] = -2;
;
; // Scan drawsegs from end to start for obscuring segs.
; // The first drawseg that has a greater scale
; // is the clip seg.
; for (ds=ds_p-1 ; ds >= drawsegs ; ds--)
; {
; // determine if the drawseg obscures the sprite
; if (ds->x1 > spr->x2
; || ds->x2 < spr->x1
; || (!ds->silhouette
; && !ds->maskedtexturecol) )
; {
; // does not cover sprite
; continue;
; }
;
; r1 = ds->x1 < spr->x1 ? spr->x1 : ds->x1;
; r2 = ds->x2 > spr->x2 ? spr->x2 : ds->x2;
;
; if (ds->scale1 > ds->scale2)
; {
; lowscale = ds->scale2;
; scale = ds->scale1;
; }
; else
; {
; lowscale = ds->scale1;
; scale = ds->scale2;
; }
;
; if (scale < spr->scale
; || ( lowscale < spr->scale
; && !R_PointOnSegSide (spr->gx, spr->gy, ds->curline) ) )
; {
; // masked mid texture?
; if (ds->maskedtexturecol)
; R_RenderMaskedSegRange (ds, r1, r2);
; // seg is behind sprite
; continue;
; }
;
;
; // clip this piece of the sprite
; silhouette = ds->silhouette;
;
; if (spr->gz >= ds->bsilheight)
; silhouette &= ~SIL_BOTTOM;
;
; if (spr->gzt <= ds->tsilheight)
; silhouette &= ~SIL_TOP;
;
; if (silhouette == 1)
; {
; // bottom sil
; for (x=r1 ; x<=r2 ; x++)
; if (clipbot[x] == -2)
; clipbot[x] = ds->sprbottomclip[x];
; }
; else if (silhouette == 2)
; {
; // top sil
; for (x=r1 ; x<=r2 ; x++)
; if (cliptop[x] == -2)
; cliptop[x] = ds->sprtopclip[x];
; }
; else if (silhouette == 3)
; {
; // both
; for (x=r1 ; x<=r2 ; x++)
; {
; if (clipbot[x] == -2)
; clipbot[x] = ds->sprbottomclip[x];
; if (cliptop[x] == -2)
; cliptop[x] = ds->sprtopclip[x];
; }
; }
;
; }
;
; // all clipping has been performed, so draw the sprite
;
; // check for unclipped columns
; for (x = spr->x1 ; x<=spr->x2 ; x++)
; {
; if (clipbot[x] == -2)
; clipbot[x] = viewheight;
;
; if (cliptop[x] == -2)
; cliptop[x] = -1;
; }
;
; mfloorclip = clipbot;
; mceilingclip = cliptop;
; R_DrawVisSprite (spr, spr->x1, spr->x2);
;
;}
;-----------------------------------------------------------------------
; R_DrawVisSprite (in r_things.c) by Arto Huusko <arto.huusko@pp.qnet.fi>
xref @W_CacheLumpNum
xref _firstspritelump
xref _dc_colormap
xref _colfunc
xref _fuzzcolfunc
xref _transcolfunc
xref _dc_translation ;byte*
xref _translationtables ;byte*
xref _dc_iscale
xref _dc_texturemid
xref _spryscale
xref _sprtopscreen
xref _centeryfrac
xref _FixedMul
xref _dc_x
xref @R_DrawMaskedColumn
xref _basecolfunc
xref _detailshift
;humm... the prototype (and all calls) should be changed to:
; void R_DrawVisSprite(vissprite_t* vis);
; because int x1 and int x2 are UNUSED! They are always just
; copies of the sprite->x1 sprite->x2
cnop 0,4
@R_DrawVisSprite:
_R_DrawVisSprite:
movem.l d2/d7/a2/a3,-(sp)
move.l a0,a2 ;save vis
move.l vp_patch(a0),d0
add.l _firstspritelump(a4),d0
moveq #101,d1 ;PU_CACHE
jsr (@W_CacheLumpNum)
move.l d0,a3 ;store patch
move.l vp_colormap(a2),_dc_colormap(a4)
beq.b .rdvs_FuzzCol ;if (!dc_colormap)
move.l vp_mobjflags(a2),d0 ;used below, too
and.l #$c000000,d0 ;& MF_TRANSLATION
beq.b .rdvs_ColFuncOK ;not true... just go on
move.l _transcolfunc(a4),_colfunc(a4)
swap d0 ;this way better scheduled for 040
move.l _translationtables(a4),_dc_translation(a4)
and.l #$FFFF,d0
sub.l #256,d0
add.l d0,_dc_translation(a4)
bra.b .rdvs_ColFuncOK
.rdvs_FuzzCol:
move.l _fuzzcolfunc(a4),_colfunc(a4)
.rdvs_ColFuncOK:
move.l vp_xiscale(a2),d0
beq.b .rdvs_SetScale ;if NULL do not do shifts etc.
bpl.b .rdvs_absskip ;this is iabs
neg.l d0
.rdvs_absskip:
move.l _detailshift(a4),d1
lsr.l d1,d0
.rdvs_SetScale:
move.l d0,_dc_iscale(a4)
move.l vp_texturemid(a2),d0 ;used below..
move.l d0,_dc_texturemid(a4)
move.l vp_scale(a2),d1 ;used below
move.l d1,_spryscale(a4)
move.l _FixedMul(a4),a0
jsr (a0)
move.l _centeryfrac(a4),_sprtopscreen(a4)
sub.l d0,_sprtopscreen(a4)
move.l vp_startfrac(a2),d2 ;d2: frac
move.l vp_x1(a2),_dc_x(a4) ;dc_x=vis->x1
move.l vp_x2(a2),d7
sub.l vp_x1(a2),d7 ;for(..; dc_x<=vis->x2;..)
blt.b .rdvs_NoDraw
.rdvs_Loop:
move.l d2,d0 ;texturecolumn=frac..
swap d0 ;.. >>FRACBITS (and then we need only WORD below)
move.l a3,a0 ;column=patch+
move.l (8,a3,d0.w*4),d0 ;patch->columnofs[texturecolumn]
rol.w #8,d0
swap d0
rol.w #8,d0 ;SWAPLONG
add.l d0,a0
jsr (@R_DrawMaskedColumn)
addq.l #1,_dc_x(a4) ;dc_x++
add.l vp_xiscale(a2),d2 ;frac += vis->xiscale
dbf d7,.rdvs_Loop
.rdvs_NoDraw:
move.l _basecolfunc(a4),_colfunc(a4)
movem.l (sp)+,d2/d7/a2/a3
rts
;void
;R_DrawVisSprite
;( vissprite_t* vis,
; int x1,
; int x2 )
;{
; column_t* column;
; int texturecolumn;
; fixed_t frac;
; patch_t* patch;
;
;
; patch = W_CacheLumpNum (vis->patch+firstspritelump, PU_CACHE);
;
; dc_colormap = vis->colormap;
;
; if (!dc_colormap)
; {
; colfunc = fuzzcolfunc;
; }
; else if (vis->mobjflags & MF_TRANSLATION)
; {
; colfunc = transcolfunc;
; dc_translation = translationtables - 256 +
; ( (vis->mobjflags & MF_TRANSLATION) >> (MF_TRANSSHIFT-8) );
; }
;
; dc_iscale = iabs(vis->xiscale)>>detailshift;
; dc_texturemid = vis->texturemid;
; frac = vis->startfrac;
; spryscale = vis->scale;
; sprtopscreen = centeryfrac - FixedMul(dc_texturemid,spryscale);
;
; for (dc_x=vis->x1 ; dc_x<=vis->x2 ; dc_x++, frac += vis->xiscale)
; {
; texturecolumn = frac>>FRACBITS;
; column = (column_t *) ((byte *)patch +
; SWAPLONG(patch->columnofs[texturecolumn]));
;
; R_DrawMaskedColumn (column);
; }
;
; colfunc = basecolfunc;
;}
;-----------------------------------------------------------------------
; R_SortVisSprites (in r_things.c) by Arto Huusko <arto.huusko@pp.qnet.fi>
xref _vissprite_p ;vissprite_t*
xref _vissprites ;FAR vissprite_t vissprites[MAXVISSPRITES]
xref _vsprsortedhead ;vissprite_t
MAXINT equ $7FFFFFFF
MAXSPRITE equ 128
cnop 0,4
@R_SortVisSprites:
_R_SortVisSprites:
movem.l a2/a3/a5,-(sp)
move.l _vissprite_p(a4),d0
beq.b .rsv_Exit ;no sprites to sort
move.l d0,a1
lea _vsprsortedhead(a4),a0 ;kept here
move.l a0,-vp_size+vp_next(a1) ;this connection is not yet made!
move.l vp_next(a0),a1
move.l vp_scale(a1),d0
bra.b .rsv_Loop
cnop 0,4
.rsv_Next:
move.l a2,a1
move.l d1,d0
.rsv_Loop:
move.l vp_next(a1),a2
move.l vp_scale(a2),d1
beq.b .rsv_Exit ;vsprsortedhead has null scale
cmp.l d1,d0
ble.b .rsv_Next
move.l a0,a3
.rsv_GoDown:
move.l vp_next(a3),a3
cmp.l vp_scale(a3),d1
bge.b .rsv_GoDown
move.l vp_next(a2),a5
move.l a5,vp_next(a1)
move.l a1,vp_prev(a5)
move.l vp_prev(a3),a5
move.l a2,vp_next(a5)
move.l a2,vp_prev(a3)
move.l a5,vp_prev(a2)
move.l a3,vp_next(a2)
bra.b .rsv_Loop
.rsv_Exit:
movem.l (sp)+,a2/a3/a5
rts
cnop 0,4
@R_NewVisSprite:
_R_NewVisSprite:
move.l _vissprite_p(a4),d0
beq.b .rn_FirstTime
cmp.l #_vissprites+vp_size*MAXSPRITE,d0
beq.b .rn_OverFlow
add.l #vp_size,_vissprite_p(a4)
;Establish proper connections between nodes. The new sprite does
;not get pointer to next sprite because that is set next time we
;get here. The pointer for last sprite is set in SortVisSprites
move.l d0,a0
move.l a0,_vsprsortedhead(a4)
sub.l #vp_size,a0
move.l d0,vp_next(a0)
move.l a0,vp_size+vp_prev(a0)
rts
.rn_OverFlow:
;;; move.l #overflow,d0
lea overflow(a4),a0
move.l a0,d0
rts
.rn_FirstTime:
move.l #_vissprites+vp_size,_vissprite_p(a4)
move.l #_vissprites,d0
rts
cnop 0,4
@R_ClearSprites:
_R_ClearSprites:
move.l #_vissprites,a0
move.l #0,_vissprite_p(a4)
lea _vsprsortedhead(a4),a1
move.l a0,vp_next(a1)
move.l a0,vp_prev(a1)
move.l a1,vp_prev(a0)
rts
;-----------------------------------------------------------------------
section __MERGED,bss
cnop 0,4
MAXSCREENWIDTH equ 1600
clipbot: ds.w MAXSCREENWIDTH
cliptop: ds.w MAXSCREENWIDTH
overflow: ds.b vp_size
;-----------------------------------------------------------------------
end